import Utils from './utils'
import Store from '@/store'
import Settings from './settings'

import { checkLogin } from './lib'

// 无需鉴权的接口
const noAuth = [
    "/Register",
	"/RegisterNext",
	"/SaveiOSPushToken"
]

// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
    // 初始化请求配置
    uni.$u.http.setConfig((config) => {
		// 设置请求前缀
		let baseURL = ''
		
		// h5 端请求访问
		// #ifdef H5
		baseURL = process.env.NODE_ENV === 'development' ? '/api' : ''
		// #endif
		
		// // 微信小程序端请求访问，不走代理
		// // #ifdef  MP-WEIXIN
		// baseURL = process.env.NODE_ENV === 'development' ? Settings.testApi : Settings.test_prod_api
		// // #endif
		
		// // APP 请求访问，不走代理
		// // #ifdef APP-PLUS
		// baseURL = process.env.NODE_ENV === 'development' ? Settings.testApi : Settings.test_prod_api
		// // #endif
		
		config.baseURL = baseURL
        return config
    })
	
	// 请求拦截
	// 可使用async await 做异步操作
	uni.$u.http.interceptors.request.use((config) => {
		// 公共
		// #ifdef H5
		// 如果是上传模块，将 baseURL 的值改为 /customUpload
		if (
			config.url.indexOf('/api/UploadFileByBase64') !== -1 ||
			config.url.indexOf('/api/GetFileInfo') !== -1
		) {
			config.baseURL = '/custom_upload'
		}
		
		// 腾讯地图定位接口模块
		if (config.url.indexOf('/ws/location/v1/network') !== -1) {
			config.baseURL = '/map_api'
		}
		
		// 如果是国四终端模块
		if (config.url.indexOf('/gs-api') !== -1) {
			config.baseURL = '/gs-api'
		}
		// #endif
		
		// 微信小程序端请求访问，不走代理
		// // #ifdef  MP-WEIXIN
		// if (config.url.indexOf('/ws/location/v1/network') !== -1) {
		// 	config.baseURL = Settings.map_location_api
		// }
		// // #endif
		
		// APP 请求访问，不走代理
		// // #ifdef APP-PLUS
		// if (config.url.indexOf('/ws/location/v1/network') !== -1) {
		// 	config.baseURL = Settings.map_location_api
		// }
		// // #endif
		
		const token = Store.state.user.token
		
	    // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
	    config.data = config.data || {}
		
		// 如果请求接口需要鉴权，那么需要添加 token
		// if (noAuth.indexOf(config.url) === -1) {
		// 	config.header['Authorization'] = 'Bearer ' + token
		// }
		
	    return config 
	}, config => { // 可使用async await 做异步操作
	    return Promise.reject(config)
	})
	
	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
		let data = response.data
		let code = data.Tag
		
		if (response.config.baseURL === '/map_api') {
			// 如果是地图服务，那么响应拦截走下方逻辑
			if (response.statusCode === 200 && response.data.status === 0) {
				return response.data
			} else {
				return Promise.reject(response.errMsg)
			}
		} else if (response.config.baseURL === '/custom_upload' && code === 3) {
			return response.data
		} else {
			// 判断 code
			if (code === 1) {
				// 如果 code 等于 1，请求成功
				return data
			} else if (code === 11) {
				// token 失效
				// Utils.popUpMsg('none', data.Message + '，这个接口报错：' + response.config.url, 10000)
				Utils.popUpMsg('error', data.Message, 1500)
				// 退出登录
				setTimeout(() => {
					Store.dispatch('user/logout').then(() => {
						checkLogin()
					})
				}, 1500)
			} else {
				// 所有的错误都走这个逻辑
				Utils.popUpMsg('error', data.Message || data.message, 3000)
				return Promise.reject(data)
			}
		}
	}, (error) => {
		// 对响应错误做点什么 （statusCode !== 200）
		if (error.config.url === '/gs-api/token/refreshToken') {
			Utils.popUpMsg('none', '国四终端服务连接失败，' + error.data, 3000) // 国四终端服务token存储失败，返回登录
			
			setTimeout(() => {
				Store.dispatch('user/logout').then(() => {
					checkLogin() // 退出登录
				})
			}, 3000)
		} else {
			Utils.popUpMsg('error', error.errMsg || error.Message, 3000)
			return Promise.reject(error)
		}
	})
}
